package com.base.myproject.client.tools;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.gwt.i18n.client.DateTimeFormat;

/**
 * 时间工具类，用于时间的处理，来得到一个时间段内的所有具体的日期的列表，
 * @author cxghiu4102@gmail.com 2011-08-15
 */
public class DateUtil {
	private static DateTimeFormat dateFormat = DateTimeFormat.getFormat("yyyy-MM-dd");
	
	/**
	 * 得到一个时间段的日期列表，这里现在只允许跨一个年度
	 * @param startDate 开始日期
	 * @param endDate 结束日期
	 * @return 日期列表
	 */
	public static List<String> getAllDateOfTimeSlot(String startDate, String endDate) {
		List<String> dateList = new ArrayList<String>();
		int startMonth = getMonth(startDate);
		int endMonth = getMonth(endDate);
		int startYear = getYear(startDate);
		int endYear = getYear(endDate);
		int startDay = getDay(startDate);
		int endDay = getDay(endDate);
		
		if (startYear == endYear) {
			dateList.addAll(getDaysOfYearFromStart2EndDate(startYear, startMonth, endMonth, startDay, endDay));
		} else {
			dateList.addAll(getDaysOfYearFromStart2EndDate(startYear, startMonth, 12, startDay, 31));
			dateList.addAll(getDaysOfYearFromStart2EndDate(endYear, 1, endMonth, 1, endDay));
		}
		return dateList;
	}
	
	/**
	 * 得到一个年度从开始日期到结束日期的日期列表，如果日期在同年同月的话，只要得到这个月的开始日期到结束日期
	 * 的日期列表就行，如果在只同一个月呢，则得到开始月从开始日期到月底的天数，开始月到结束月每个月的天数日期列表，
	 * 再得到结束月1号到结束日期的日期列表。他们的总数，就是这个开始日期到结束日期的所有日期列表
	 * @param year 指定年
	 * @param startMonth 开始月份
	 * @param endMonth 结束月份
	 * @param startDay 开始月的开始日期
	 * @param endDay 结束月的结束日期
	 * @return 开始日期到结束日期的日期列表
	 */
	private static List<String> getDaysOfYearFromStart2EndDate(int year, int startMonth, int endMonth, int startDay, int endDay) {
		List<String> dateList = new ArrayList<String>();
		
		if (startMonth == endMonth) {
			dateList.addAll(getDaysOfMonthFromStart2EndDate(year, startMonth, startDay, endDay));
		} else {
			int startDays = getDaysOfMonth(year, startMonth);
			
			dateList.addAll(getDaysOfMonthFromStart2EndDate(year, startMonth, startDay, startDays));
			//得到开始不在开始月分和结束月份之前的月份的所有日期
			for (int month=startMonth + 1 ; month < endMonth; month++) {
				dateList.addAll(getDaysOfOneMonth(year, month));
			}
			dateList.addAll(getDaysOfMonthFromStart2EndDate(year, endMonth, 1, endDay));
		}
		
		return dateList;
	}
	
	/**
	 * 返回指定的年月从那一天到那一天的日期列表
	 * @param year 指定年
	 * @param month 指定月
	 * @param startDay 一个月中的开始的日期
	 * @param endDay 一个月中的结束日期
	 * @return 指定日期区间的列表
	 */
	private static List<String> getDaysOfMonthFromStart2EndDate(int year, int month, int startDay, int endDay) {
		List<String> dateList = new ArrayList<String>();
		for (int start=startDay; start <= endDay; start++) {
			dateList.add(getDate(year, month, start));
		}
		return dateList;
	}
	
	/**
	 * 得到指定的年月的日期的列表
	 * @param year 指定的年
	 * @param month 指定的月
	 * @return 一个月中所有日期的列表
	 */
	private static List<String> getDaysOfOneMonth(int year, int month) {
		List<String> dateList = new ArrayList<String>();
		int datesOfMonth = getDaysOfMonth(year, month);
		dateList.addAll(getDaysOfMonthFromStart2EndDate(year, month, 1, datesOfMonth));
		return dateList;
	}
	
	/**
	 * 计算指定的年月份有多少天
	 * @param year 指定的年
	 * @param month 指定的月
	 * @return 得到指定年月的有多少天
	 */
	public static int getDaysOfMonth(int year, int month) {
		int days = 0;
		if (month != 2) {
			switch (month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				days = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				days = 30;
			}
		} else {
			if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
				days = 29;
			else
				days = 28;
		}
		return days;
	}
	
	public static String getDate(int year, int month, int day) {
		StringBuilder groupDate = new StringBuilder();
		String date = groupDate.append(year).append("-").append(getNumberOfTwoPlaces(month)).append("-").append(getNumberOfTwoPlaces(day)).toString();
		return date;
	}
	
	private static String getNumberOfTwoPlaces(int number) {
		String s = number < 10 ? "0" + number : "" + number;
		return s;
	}
	
	public static int getMonth(String date) {
		int month = getMonth(castString2Date(date));
		return month;
	}
	
	public static int getYear(String date) {
		int year = getYear(castString2Date(date));
		return year;
	}
	
	public static int getDay(String date) {
		int day = getDay(castString2Date(date));
		return day;
	}
	
	public static int getMonth(Date date) {
		int month = date.getMonth() + 1;
		return month;
	}
	
	public static int getYear(Date date) {
		int year = date.getYear() + 1900;
		return year;
	}
	
	public static int getDay(Date date) {
		int day = date.getDate();
		return day;
	}
	
	/**
	 * 字符串向日期类型的转换
	 * @param dateString 要进行转换的字符串
	 * @return 转换后的日期
	 */
	public static Date castString2Date(String dateString) {
		Date date = dateFormat.parse(dateString);
		return date;
	}
}
